package com.kevin.Code.Math;

/**
 * @author Vinlee Xiao
 * @Classname DivideTwoIntegers
 * @Description Leetcode 29. 两数相除 难度 中等难度 没啥思路 参考官方题解依然迷惑
 * @Date 2021/12/11 11:40
 * @Version 1.0
 */
public class DivideTwoIntegers {

    final static int MAX_VALUE = Integer.MAX_VALUE;
    final static int MIN_VALUE = Integer.MIN_VALUE;

    /**
     * 自己思路：利用倍乘法
     * 注意点：出现溢出的现象位
     *
     * @param dividend
     * @param divisor
     * @return
     */
    public int divide(int dividend, int divisor) {

        //会产生溢出
        if (dividend == MIN_VALUE && divisor == -1) {
            return MAX_VALUE;
        }

        //用来标志最后的结果
        boolean sign = false;
        if ((dividend > 0 && divisor > 0) || (dividend < 0) && (divisor < 0)) {
            sign = true;
        }

        //转换为负数避免产生溢出 之所以转换成负数 是正数运算结果可能出现溢出 结果要分情况讨论
        if (dividend > 0) {
            dividend = -dividend;
        }
        if (divisor > 0) {
            divisor = -divisor;
        }

        int result = 0;

        //细节问题值得注意 转换成负数后
        while (dividend <= divisor) {

            int countBit = 1;
            int subtractNum = divisor;

            //subtractNum+subtractNum >= dividend
            //倍乘法
            while (subtractNum >= dividend - subtractNum) {
                //相当于subtractNum + subtractNum
                subtractNum = subtractNum + subtractNum;
                //
                countBit = countBit + countBit;
            }
            dividend = dividend - subtractNum;
            result = result + countBit;
        }

        //如果被除数大于除数

        return sign == false ? -result : result;
    }
}
